/*
    智能指针，weak_ptr(弱指针)
*/

#include <iostream>
#include <memory>
#include <string>

using namespace std;

int main(int argc, char const *argv[])
{
    // p1->int(9) 共享指针
    auto p1 = make_shared<int>(9);  //p1->int(9)
    cout << "引用计数器" << p1.use_count() << endl;

    
    shared_ptr<int> p2 = p1;    //引用计数 +1
    cout << "引用计数器" << p2.use_count() << endl;

    weak_ptr<int> w1 = p1;      //弱引用并不增加对象的引用计数，但是它知道所托管的对象是否还存活。
    cout << "引用计数器" << w1.use_count() << endl;

    // 使用时调用lock函数，获得一个共享指针
    // 弱指针不拥有对象的所有权，仅观察shared_ptr管理的对象，不会增加引用计数
    // 要想真正的进行管理，需要使用lock将weak_ptr 转化为shared_ptr
    // 返回的shared_ptr 没有管理资源的shared_ptr隐式转化为flase
    // 管理有效资源的shared_ptr 隐式转化为true
    if(auto p = w1.lock())
    {
        cout << "弱引用操作中。。。" << endl;
        cout << "引用计数器" << w1.use_count() << endl;
        cout << *p << endl;
        *p = 42;
        cout << endl << endl;
    }
    cout << "引用计数器" << p1.use_count() << endl;
    cout << *p1 << endl;
    return 0;
}
